package 炫彩系统类

import (
	wapi "gitee.com/go_888/xcgui/xcgui/wapi"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
	"syscall"
	"unsafe"
)

// X结构_全局键盘钩子 全局键盘钩子.
type X结构_全局键盘钩子 struct {
	X钩子句柄 uintptr // 钩子句柄.
}

// NewHookKeyboard 创建一个全局键盘钩子, 可用于监听全局键盘消息, 失败返回nil.
//
// KeyboardProc: 回调函数, 可接收键盘消息. 在回调函数中放行键盘消息应该 return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam). 拦截键盘消息应该 return 1.
func X创建全局键盘钩子(程序函数 wapi.LowLevelKeyboardProc) *X结构_全局键盘钩子 {
	p := &X结构_全局键盘钩子{}
	p.X钩子句柄 = wapi.SetWindowsHookExW(wapi.X常量_钩子_KEYBOARD_LL, syscall.NewCallback(程序函数), wapi.X取已加载模块句柄(""), 0)
	if p.X钩子句柄 == 0 {
		return nil
	}
	return p
}

// Unhook 卸载全局键盘钩子.
func (h *X结构_全局键盘钩子) X卸载全局键盘钩子() bool {
	return wapi.UnhookWindowsHookEx(h.X钩子句柄)
}

// CallNextHookEx_Keyboard 用于 NewHookKeyboard 的参数 KeyboardProc 回调函数的返回值.
//   - 在回调函数中放行键盘消息应该 return wutil.X调用下一个键盘钩子(nCode, wParam, lParam). 拦截键盘消息应该 return 1.
func X调用下一个键盘钩子(nCode int32, wParam xcc.X窗口事件, lParam *wapi.X结构体_键盘输入事件) uintptr {
	return wapi.CallNextHookEx(0, nCode, uintptr(wParam), uintptr(unsafe.Pointer(lParam)))
}

// X结构_全局鼠标钩子 全局鼠标钩子.
type X结构_全局鼠标钩子 struct {
	X钩子句柄 uintptr // 钩子句柄.
}

// 创建一个全局键盘钩子, 可用于监听全局键盘消息, 失败返回nil.
//
// MouseProc: 回调函数, 可接收鼠标消息. 在回调函数中放行鼠标消息应该 return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam). 拦截鼠标消息应该 return 1.
func X创建全局鼠标钩子(程序函数 wapi.LowLevelMouseProc) *X结构_全局鼠标钩子 {
	p := &X结构_全局鼠标钩子{}
	p.X钩子句柄 = wapi.SetWindowsHookExW(wapi.X常量_钩子_MOUSE_LL, syscall.NewCallback(程序函数), wapi.X取已加载模块句柄(""), 0)
	if p.X钩子句柄 == 0 {
		return nil
	}
	return p
}

// Unhook 卸载全局鼠标钩子.
func (h *X结构_全局鼠标钩子) X卸载全局鼠标钩子() bool {
	return wapi.UnhookWindowsHookEx(h.X钩子句柄)
}

// CallNextHookEx_Mouse 用于 NewHookMouse 的参数 MouseProc 回调函数的返回值.
//   - 在回调函数中放行鼠标消息应该 return wutil.X调用下一个鼠标钩子(nCode, wParam, lParam). 拦截鼠标消息应该 return 1.
func X调用下一个鼠标钩子(nCode int32, wParam xcc.X窗口事件, lParam *wapi.X结构体_鼠标输入事件) uintptr {
	return wapi.CallNextHookEx(0, nCode, uintptr(wParam), uintptr(unsafe.Pointer(lParam)))
}

// GetHigh16Bits 获取 int32 的高16位.
func X取高16位(值 int32) int16 {
	return int16(值 >> 16)
}

// GetLow16Bits 获取 int32 的低16位.
func X取低16位(值 int32) int16 {
	return int16(值 & 0xFFFF)
}
